package com.example.springboottest.example.ratelimit;

import com.google.common.util.concurrent.RateLimiter;

import java.util.concurrent.TimeUnit;

/**
 * 限流分为令牌桶算法和漏桶算法
 * 其中令牌桶算法 是 限制流入的平均速度，可以提前透支获取，应付突然的情况
 * 其中漏桶算法   是 限制流出的平均速度
 */
public class RateLimitTest {
    public static void main(String[] args) {
        limit();
    }

    public static void limit() {
        /*每秒向桶中存放5个 Token */
        final RateLimiter limit = RateLimiter.create(5);
        /*产生突发流量时 一次从桶中获取50个 Token，后面需要等10秒钟 */
//        System.out.println(limit.acquire(50));
        for (int i = 0; i < 10; i++) {
            /*从桶中获取 Token */
            double waitTime = limit.acquire();
            /*尝试从桶中获取 Token ，获取不到不等待立即返回 false */
//            boolean result = limit.tryAcquire();
//            if (result) {
//                System.out.println("成功获取到 Token");
//            }
            /*尝试从桶中获取 Token ，只等待 lOms */
//            result = limit.tryAcquire(10, TimeUnit.MILLISECONDS);
//            if (result) {
//                System.out.println("成功获取到 Token");
//            }
            System.out.println(waitTime);
        }
    }
}
